#pragma once 

#include <iostream>
#include <string>
#include <unistd.h>
#include <functional>
#include <pthread.h>

/**
 * @namespace ThreadModule
 * @brief 提供线程相关的功能和类
 */
namespace ThreadModule
{
   /**
    * @brief 使用std::function封装的线程执行函数类型
    */
   using func_t =std::function<void(std::string)>;

   /**
    * @class Thread
    * @brief 一个简单的线程封装类
    */
   class Thread
   {
   private:
        pthread_t _tid; ///< 线程ID
        std::string _name; ///< 线程名称
        func_t _func; ///< 线程执行的函数
        bool _stop; ///< 标记线程是否停止

   public:
        /**
         * @brief 执行线程的主函数
         */
        void Excute()
        {
          _func(_name);
        }

        /**
         * @brief 构造函数
         * @param func 线程执行的函数
         * @param name 线程名称，默认为"none-name"
         */
        Thread(func_t func,std::string name="none-name")
        :_func(func),_name(name),_stop(true)
        {}

        /**
         * @brief 线程例程
         * @param arg 线程对象的指针
         * @return nullptr
         */
        static void *threadroutine(void *arg)
        {
          Thread *p=static_cast<Thread*>(arg);
          p->Excute();
          return nullptr;
        }

        /**
         * @brief 启动线程
         * @return 成功返回true，否则返回false
         */
        bool Start()
        {
         //成功返回0
         //this是threadroutine的参数
          int n=pthread_create(&_tid,nullptr,threadroutine,this);
          
           if (!n)
           {
            _stop=false;
            return true;
           }
           else
           {
            return false;
           }
          
        }

        /**
         * @brief 将线程分离
         */
        void Detach()
        {
         if(!_stop)
         {
            pthread_detach(_tid);
         }
        }

        /**
         * @brief 等待线程结束
         */
        void Join()
        {
          if(!_stop)
          {
            pthread_join(_tid,nullptr);
          }
        }

        /**
         * @brief 获取线程名称
         * @return 线程名称
         */
        std::string GetName()
        {
          return _name;
        }

        /**
         * @brief 析构函数
         */
        ~Thread()
        {}
   };
}